POJ——1012
原以为POJ挂掉了,不知道是不是,最近连上google都够呛,啥水木也不太行,A了一水题
又是约瑟夫环的变种,解答也再次让我无语了一次
自己写的又超时了,后来发现此题可以开挂!!!当然话说回来,它的时间限制偏要让我不能直接输出,而偏偏得先把结果存入数组中
原题:http://poj.org/problem?id=1012
1 #include <iostream> 2 3 using namespace std; 4 5 bool IsOk(int k, int m) 6 { 7 int n = 2*k; 8 int x = 1; 9 while(n > k) 10 { 11 x = (x-1+m)%n; 12 if(x == 0) 13 { 14 x = n; 15 } 16 if(x <= k ) 17 { 18 return false; 19 } 20 n--; 21 } 22 return true; 23 } 24 25 int main() 26 { 27 int k = 0, m = 0; 28 int res[14] ; 29 for(k = 1; k <= 14; k++) 30 { 31 for(m=k+1;;m++) 32 { 33 if(IsOk(k,m)) 34 { 35 res[k-1] = m; 36 break; 37 } 38 } 39 } 40 while(cin >> k && k != 0) 41 { 42 cout << res[k-1] << endl; 43 } 44 return 0; 45 }
话说那个IsOk函数有另一个写法,区别很细微,以我的理解,一个是从1开始,另一个是从0开始
bool IsOk(int k, int m) { int n = 2*k; int x = 0; while(n > k) { x = (x-1+m)%n; if(x < k ) { return false; } n--; } return true; }